package com.coderside.fragment.arithmetic.packchars;

import java.util.ArrayList;
import java.util.List;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String ss = "��Ϊ���ز�����Ĺ�̵��У�һ�����αȽ��٣���õ��ز����¶ȱȽϸߵ�����·ŵ�ʱ��һ�����������ϸ��ͻ����ֳ����������ϸ��������»ᱻ��ԭ���������Ρ�������������Ȼ�缫���밷�ϳ������������ǿ�°��������ǳ���ʳ��ʣ���߲ˣ������ǵĽ����ǲ���ģ�������ʳ������̲�֮���ʳƷ��θ���ļ��ʾͱȽϸ�";
		String text = HexUtils.convert(ss.getBytes());
		pack(text, 50);
	}

	/**
	 * ��0��ʼ����49Ϊ��0λ�õĵ�һ�� ������һ����ܺ͸ö���ͬ�Ķ� 
	 * ��1��ʼ����50Ϊ��1λ�õĵ�һ�� ������һ����ܺ͸ö���ͬ�Ķ�
	 * ��2��ʼ����51Ϊ��2λ�õĵ�һ�� ������һ����ܺ͸ö���ͬ�Ķ�
	 * ��1λ�ÿ�ʼ��һ��
	 * 
	 * @param text
	 * @param len
	 */
	private static void pack(String text, int len) {
		byte[] bs = text.getBytes();
		List<Element> list = new ArrayList<Element>();
		for (int i = 0; i < bs.length; i++) {
			//			byte a = bs[i];
			//			byte b = bs[i + len - 1];
			int nextStart = i + len;
			int z = 1;
			while (-1 != (nextStart = sub(bs, i, nextStart, len))) {
				Element e = new Element(i, nextStart, len, z++);
				e.setXY(i + 1, nextStart + 1);
				addElement(list, e);
				nextStart += len;
			}
		}
		System.out.println(list);
	}

	private static void addElement(List<Element> list, Element e) {
		if (e.getSection() == 1) {
			for (Element element : list) {
				if (element.getNext().getX() == e.getStart()) {
					list.remove(element);
					break;
				}
			}

		}
		list.add(e);

	}

	private static int sub(byte[] bs, int start, int nextStart, int len) {
		for (int i = nextStart; i < bs.length; i++) {
			if (i + len >= bs.length) {
				break;
			}
			if (bs[start] == bs[i] && bs[start + len] == bs[i + len]) {
				return i;
			}
		}
		return -1;
	}
}
